perm filename RCBDYN[HAL,HE] blob sn#117123 filedate 1974-08-25 generic text, type T, neo UTF8
.NEWSS (MOVING ASSEMBLY LINES,ASSEMBLY LINES)

	The initial  system does not  include the ability  to specify
that  a frame  (eg. a  conveyor belt) is  continually moving  in some
predictable  way.    However,    consider  the  following  segment  of
hypothetical  HAL  code  which  will  hopefully  make  this  addition
plausible.   The basic idea is to invent dynamic variables and frames
which can  be predicted  at  compile-time and  monitored at  runtime.
Anything attached  to a dynamic frame automatically  moves along with
it.  When the arm moves  to a frame  attached  to a  dynamic
frame, the planner uses a `predicting function' to estimate where the
destination  frame should be  and the servo  continually monitors the
dynamic variables,  invokes the relevant calculators, and updates the
destination accordingly.
Here is an example in a hypothetical extended HAL:


.UNFILL
.APART
	SCALAR TIME_OF_LOCATION;
	ASSERT TIME_OF_LOCATION = 0;
	FRAME PUMP_BASE, PUMP_GRASP, X;
	PUMP_BASE ← [ ... ];
.COMT 16
		COMMENT this is an estimate of where the vision routine
		is going to locate the PUMP_BASE;
.end
	PUMP_GRASP ← PUMP_BASE * [ ... ];
	DYNAMIC_FRAME CONVEYOR;
.COMT 16
		COMMENT when the conveyor is added to the system,
		a reserved word LINEAR_TRAVEL_OF_THE_CONVEYOR would
		have to be added to the syntax and the servo would
		have to be told what to monitor through the A-to-D
		in order to determine its value.  This variable could
		then be used in the calculator expressions for any
		DYNAMIC_FRAME.  The next statement asserts a scalar
		function which can be used by the compiler to predict
		the value of LINEAR_TRAVEL_OF_THE_CONVEYOR, given
		a starting value (eg. START_C) and a time duration 
		(eg. DELTA_T);
.end
	ASSERT LINEAR_TRAVEL_OF_THE_CONVEYOR = (START_C + 7.3*DELTA_T);
.COMT 16
		COMMENT the next statement sets up the necessary calculator
		within the graph structure;
.end
	CONVEYOR <= [(-10, 0, 0):(0, 0, 0)] +
		(0, LINEAR_TRAVEL_OF_THE_CONVEYOR, 0);
	VISUALLY_LOCATE(PUMP_BASE, TIME_OF_LOCATION);
.COMT 16
		COMMENT this is procedure which uses vision to set the
		value of the FRAME PUMP_BASE and set the TIME_OF_LOCATION
		so the servo can determine the DELTA_T needed to correct
		for the conveyor's movement;
.end
	ATTACH PUMP_BASE TO CONVEYOR AT TIME_OF_LOCATION;
.COMT 16
		COMMENT this attaches the PUMP_BASE to the CONVEYOR at the
		indicated time.  The servo can adjust accordingly;
.end
	MOVE YELLOW TO PUMP_GRASP;
.COMT 16
		COMMENT the planner estimates what the value of
		LINEAR_TRAVEL_OF_THE_CONVEYOR would be, predicts where
		PUMP_GRASP would be (and how long it would take to get there)
		and plans a trajectory to get to the predicted destination.
		At runtime the servo monitors the actual changes of
		LINEAR_TRAVEL_OF_THE_CONVEYOR and adjusts accordingly.
		Upon reaching the destination, the arm continues to track
		the object along the conveyor until a MOVE is made to
		some frame not attached to the conveyor;
.end
	ASSERT TIME(CENTER) = 100;
	CENTER YELLOW;
.COMT 16
		COMMENT since the time to execute a CENTER varies depending
		upon the relative position of the object and the distance
		between the fingers, the planner has to be given an estimate
		of how long this is expected to take, so it can predict
		the PUMP_BASE's movement along the conveyor;
.end
	DETACH PUMP_BASE FROM CONVEYOR;
	ATTACH PUMP_BASE TO YELLOW;
.COMT 16
		COMMENT notice that the arm has still not moved away from
		the dynamic frame; hence it is still tracking;.
.end
	MOVE PUMP_BASE TO X;
.COMT 16
		COMMENT this finally breaks the dynamic bond between the arm
		and the conveyor;
.end
.REFILL